#include "recboxitem.h"
#include "ui_recboxitem.h"
#include <QDebug>
#include <QPropertyAnimation>


recBoxItem::recBoxItem(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::recBoxItem)
{
    ui->setupUi(this);
    ui->musicImageBox->installEventFilter(this);
}

/**
 * @brief 设置推荐项文本
 * @param text 要显示的文本内容
 * @details 该函数用于设置推荐项下方显示的文本标签内容，
 *          通过更新recBoxItemText标签的文本实现。
 */
void recBoxItem::setRecText(const QString &text) const
{
    ui->recBoxItemText->setText(text);
}

/**
 * @brief 设置推荐项图片
 * @param imagePath 图片文件路径
 * @details 该函数用于设置推荐项的背景图片，
 *          通过设置recMusicImage控件的样式表来显示指定路径的图片。
 */
void recBoxItem::setRecImage(const QString &imagePath) const
{
    const QString style = "background-image:url(" + imagePath + ")";
    ui->recMusicImage->setStyleSheet(style);
    // qDebug() << "setRecImage" << imagePath;
}
recBoxItem::~recBoxItem()
{
    delete ui;
}

/**
 * @brief 事件过滤器，处理鼠标进入和离开事件
 * @param watched 被监视的对象
 * @param event 事件对象
 * @return bool 如果事件被处理返回true，否则返回false
 * @details 该函数用于处理鼠标进入和离开musicImageBox控件时的动画效果：
 *          1. 鼠标进入时：将图片控件向上移动产生悬浮效果
 *          2. 鼠标离开时：将图片控件恢复到原始位置
 *          动画持续时间为150毫秒，使用QPropertyAnimation实现几何属性变化。
 * @note 此函数重写了父类QObject的eventFilter虚函数
 */
bool recBoxItem::eventFilter(QObject *watched, QEvent *event)
{
    // 如果被监视的对象是musicImageBox
    if (watched == ui->musicImageBox)
    {
        // 如果事件类型是进入
        if (QEvent::Enter == event->type())
        {
            // 创建一个动画对象，设置动画属性为geometry，持续时间为150ms
            QPropertyAnimation *animal = new QPropertyAnimation(ui->musicImageBox, "geometry");
            animal->setDuration(150);
            // 设置动画的起始值为musicImageBox的当前矩形
            animal->setStartValue(QRect(11, 11, ui->musicImageBox->width(), ui->musicImageBox->height()));
            // 设置动画的结束值为musicImageBox的矩形，y坐标为0
            animal->setEndValue(QRect(11, 0, ui->musicImageBox->width(), ui->musicImageBox->height()));
            // 开始动画
            animal->start();

            // 当动画结束时，删除动画对象
            connect(animal, &QPropertyAnimation::finished, this, [=]() {
                delete animal;
            });
        }
        // 如果事件类型是离开
        else if (QEvent::Leave == event->type())
        {
            // 创建一个动画对象，设置动画属性为geometry，持续时间为150ms
            QPropertyAnimation *animal = new QPropertyAnimation(ui->musicImageBox, "geometry");
            animal->setDuration(150);
            // 设置动画的起始值为musicImageBox的矩形，y坐标为0
            animal->setStartValue(QRect(11, 0, ui->musicImageBox->width(), ui->musicImageBox->height()));
            // 设置动画的结束值为musicImageBox的当前矩形
            animal->setEndValue(QRect(11, 11, ui->musicImageBox->width(), ui->musicImageBox->height()));
            // 开始动画
            animal->start();

            // 当动画结束时，删除动画对象
            connect(animal, &QPropertyAnimation::finished, this, [=]() {
                delete animal;
            });
        }
        // 返回true，表示事件已经被处理
        return true;
    }
    return QObject::eventFilter(watched, event);
}

